/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package AplicacionMVC;

import funciones.Tratamiento;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/**
 *
 * @author inftel
 */
public class ModeloFormulario {
    private  BaseDatos bd;
    
    public ModeloFormulario() throws SQLException{
        bd= new BaseDatos();       
    }
    public void conectar() throws SQLException{
        bd.conectar();
    }
    public void desconectar() throws SQLException{
        bd.desconectar();
    }
    public void insertarAlergias(String DNI, String NSS, ArrayList<String> lista) throws SQLException{
        ArrayList<String> listaID = obtenerIdalergia(lista);
        bd.modificarBD("delete from pacientes_alergias where dni='"+DNI+"' and nss='"+NSS+"'");
        PreparedStatement pst = bd.crearPreparedStatement("insert into pacientes_alergias (dni,nss,idalergia) values ('"+DNI+"','"+NSS+"',?)");
        for(String l : listaID){
            pst.setString(1,l);
            pst.executeUpdate();
        }
    }
    public void insertarDiscapacidades(String DNI, String NSS, ArrayList<String> lista) throws SQLException{
        ArrayList<String> listaID = obtenerIddiscapacidad(lista);
        bd.modificarBD("delete from pacientes_discapacidades where dni='"+DNI+"' and nss='"+NSS+"'");
        PreparedStatement pst = bd.crearPreparedStatement("insert into pacientes_discapacidades (dni,nss,iddiscapacidad) values ('"+DNI+"','"+NSS+"',?)");
        for(String l : listaID){
            pst.setString(1,l);
            pst.executeUpdate();
        }
    }
    public  ArrayList<String> obtenerIdalergia(ArrayList<String> nombres) throws SQLException{
        ResultSet resultado = bd.consultar("select * from alergias");
        HashMap<String,String> paresNombreId = new HashMap<String,String>();
        while(resultado.next()){
            paresNombreId.put(resultado.getString("nombre"),resultado.getString("idalergia"));
        }
        ArrayList<String> listaid = new ArrayList<String>();
        for(String n: nombres) listaid.add(paresNombreId.get(n));
        return listaid;
    }
    public  ArrayList<String> obtenerIddiscapacidad(ArrayList<String> nombres) throws SQLException{
        ResultSet resultado = bd.consultar("select * from discapacidades");
        HashMap<String,String> paresNombreId = new HashMap<String,String>();
        while(resultado.next()){
            paresNombreId.put(resultado.getString("nombre"),resultado.getString("iddiscapacidad"));
        }
        ArrayList<String> listaid = new ArrayList<String>();
        for(String n: nombres) listaid.add(paresNombreId.get(n));
        return listaid;
    }
    public int insertarDiagnostico(String idmedico, String DNI, String NSS, String fecha, String diagnostico) throws SQLException{
        return bd.modificarBD("insert into diagnostico (idmedico, dni, nss, fecha, diagnostico) values ('"+idmedico+"','"+DNI+"','"+NSS+"',to_date('"+fecha+"','dd/mm/yyyy hh24:mi'),'"+diagnostico+"')"); 
    }
    public int insertarComentario(String DNI, String NSS, String comentario) throws SQLException{
        return bd.modificarBD("update PACIENTES set COMENTARIO='"+comentario+"' where DNI='"+DNI+"' and NSS='"+NSS+"' ");
    }
    public void insertarTratamientos(ArrayList<ArrayList<Object>> filas,String DNI, String NSS) throws SQLException{
        PreparedStatement pstmedicinas = bd.crearPreparedStatement("update medicinas set cancelada=1, motivocancelacion=? where idmedico=? and dni='"+DNI+"' and nss='"+NSS+"' and fecha=to_date(?,'dd/mm/yyyy hh24:mi') and idmedicamento=?");
        PreparedStatement pstotros = bd.crearPreparedStatement("update otros set cancelada=1, motivocancelacion=? where idmedico=? and dni='"+DNI+"' and nss='"+NSS+"' and fecha=to_date(?,'dd/mm/yyyy hh24:mi') and comentario=?");
        PreparedStatement pstcuras = bd.crearPreparedStatement("update curas set cancelada=1, motivocancelacion=? where idmedico=? and dni='"+DNI+"' and nss='"+NSS+"' and fecha=to_date(?,'dd/mm/yyyy hh24:mi') and cura=?");
        for(ArrayList<Object> campos : filas){
            if(((Boolean)campos.get(8))==true){
                if(((String)campos.get(0)).equals("Medicinas")){
                    String idmedicamento = getMedicamento((String) campos.get(3),(String) campos.get(4));
                    pstmedicinas.setString(1,(String)campos.get(9));
                    pstmedicinas.setString(2, (String)campos.get(1));
                    pstmedicinas.setString(3, (String)campos.get(2));
                    pstmedicinas.setString(4, idmedicamento);
                    pstmedicinas.executeUpdate();
                }else if(((String)campos.get(0)).equals("Otros")){
                    pstotros.setString(1,(String)campos.get(9));
                    pstotros.setString(2, (String)campos.get(1));
                    pstotros.setString(3, (String)campos.get(2));
                    pstotros.setString(4, (String)campos.get(3));
                    pstotros.executeUpdate();
                }else{
                    pstcuras.setString(1,(String)campos.get(9));
                    pstcuras.setString(2, (String)campos.get(1));
                    pstcuras.setString(3, (String)campos.get(2));
                    pstcuras.setString(4, (String)campos.get(3));
                    pstcuras.executeUpdate();
                }
            }
        }
    }
    public void insertarMedicinas(ArrayList<ArrayList<Object>> filas, String idmedico, String DNI, String NSS,String fecha) throws SQLException{
        PreparedStatement pst = bd.crearPreparedStatement("insert into medicinas (idmedico, dni, nss, fecha, idmedicamento, inicio, fin, frecuencia, cancelada, motivocancelacion) values ('"+idmedico+"','"+DNI+"','"+NSS+"',to_date('"+fecha+"','dd/mm/yyyy hh24:mi'),?,?,?,?,null,null)");
        for(ArrayList<Object> campos : filas){ 
            String idmedicamento = getMedicamento((String) campos.get(0),(String) campos.get(1));
            if(idmedicamento != ""){
                pst.setString(1,idmedicamento);
                pst.setString(2,(String) campos.get(2));
                pst.setString(3,(String) campos.get(3));
                if(campos.get(4)!=null)pst.setInt(4,(Integer)campos.get(4));
                else pst.setString(4,null);
                pst.executeUpdate();
            }
        }
    }
    public void insertarCuras(ArrayList<ArrayList<Object>> filas, String idmedico, String DNI, String NSS,String fecha) throws SQLException{
        PreparedStatement pst = bd.crearPreparedStatement("insert into curas (idmedico, dni, nss, fecha, cura, inicio, fin, frecuencia, cancelada, motivocancelacion) values ('"+idmedico+"','"+DNI+"','"+NSS+"',to_date('"+fecha+"','dd/mm/yyyy hh24:mi'),?,?,?,?,null,null)");
        for(ArrayList<Object> campos : filas){ 
            if(campos.get(0)!=null){
                pst.setString(1,(String) campos.get(0));
                pst.setString(2,(String) campos.get(1));
                pst.setString(3,(String) campos.get(2));
                if(campos.get(3)!=null)pst.setInt(4,(Integer)campos.get(3));
                else pst.setString(4,null);
                pst.executeUpdate();
            }
        }
    }
    public void insertarOtros(ArrayList<ArrayList<Object>> filas, String idmedico, String DNI, String NSS,String fecha) throws SQLException{
        PreparedStatement pst = bd.crearPreparedStatement("insert into otros (idmedico, dni, nss, fecha, comentario, inicio, fin, frecuencia, cancelada, motivocancelacion) values ('"+idmedico+"','"+DNI+"','"+NSS+"',to_date('"+fecha+"','dd/mm/yyyy hh24:mi'),?,?,?,?,null,null)");
        for(ArrayList<Object> campos : filas){ 
            if(campos.get(0)!=null){
                pst.setString(1,(String) campos.get(0));
                pst.setString(2,(String) campos.get(1));
                pst.setString(3,(String) campos.get(2));
                if(campos.get(3)!=null)pst.setInt(4,(Integer)campos.get(3));
                else pst.setString(4,null);
                pst.executeUpdate();
            }
        }
    }
    public void insertarFotos(String idMedico,String DNI,String NSS,String Fecha,ArrayList<String> lista) throws SQLException{
        PreparedStatement pst = bd.crearPreparedStatement("insert into FotoDiagnostico (idmedico,dni,nss,fecha,path) values ('"+idMedico+"', '"+DNI+"', '"+NSS+"',to_date('"+Fecha+"','dd/mm/yyyy hh24:mi'),?)");
        for(String i : lista){ 
            pst.setString(1,i);
            pst.executeUpdate();
        }
    }
    public ArrayList<Tratamiento> getMedicinas(String DNI, String NSS) throws SQLException{
        // consulta de la tabla MEDICINAS
        ResultSet resultado  = bd.consultar("select idmedico, to_char(fecha,'dd/mm/yyyy hh24:mi') fecha, to_char(inicio,'dd/mm/yyyy hh24:mi') inicio, to_char(fin,'dd/mm/yyyy hh24:mi') fin, frecuencia, cancelada, motivocancelacion, mo.nombre, mo.marca"
                                + " from medicamento mo, medicinas me"
                                + " where to_char(fin,'yyyy/mm/dd') >= to_char(sysdate,'yyyy/mm/dd')"
                                + " and  to_char(inicio,'yyyy/mm/dd') <= to_char(sysdate,'yyyy/mm/dd')"
                                + " and (cancelada is null or cancelada = 0)"
                                + " and (me.dni = '"+DNI+"' and me.nss = '"+NSS+"')"
                                + " and (me.idmedicamento = mo.idmedicamento)");
        ArrayList<Tratamiento> lista = new ArrayList<Tratamiento>();
        
        while(resultado.next()){
            Tratamiento med = new Tratamiento();
            med.setMedico(resultado.getString("idmedico"));
            med.setFecha(resultado.getString("fecha"));
            med.setInicio(resultado.getString("inicio"));
            med.setFin(resultado.getString("fin"));
            med.setFrecuencia(resultado.getInt("frecuencia"));
            med.setCancelada(resultado.getBoolean("cancelada"));
            med.setMotivoCancelacion(resultado.getString("motivocancelacion"));
            med.setNombre(resultado.getString("nombre"));
            med.setMarca(resultado.getString("marca"));
            lista.add(med);
        }
        return lista;
    }
    
    public ArrayList<Tratamiento> getCuras(String DNI, String NSS) throws SQLException{
        ResultSet resultado  = bd.consultar("select idmedico, to_char(fecha,'dd/mm/yyyy hh24:mi') fecha,to_char(inicio,'dd/mm/yyyy hh24:mi') inicio, to_char(fin,'dd/mm/yyyy hh24:mi') fin, frecuencia, cancelada, motivocancelacion, cura"
                        + " from curas"
                        + " where to_char(fin,'yyyy/mm/dd') >= to_char(sysdate,'yyyy/mm/dd')"
                        + " and  to_char(inicio,'yyyy/mm/dd') <= to_char(sysdate,'yyyy/mm/dd')"
                        + " and (cancelada is null or cancelada = 0)"
                        + " and (dni = '"+DNI+"' and nss = '"+NSS+"')");     
        
       ArrayList<Tratamiento> lista = new ArrayList<Tratamiento>();
        
        while(resultado.next()){
            Tratamiento med = new Tratamiento();
            med.setMedico(resultado.getString("idmedico"));
            med.setFecha(resultado.getString("fecha"));
            med.setInicio(resultado.getString("inicio"));
            med.setFin(resultado.getString("fin"));
            med.setFrecuencia(resultado.getInt("frecuencia"));
            med.setCancelada( resultado.getBoolean("cancelada"));
            med.setMotivoCancelacion(resultado.getString("motivocancelacion"));
            med.setNombre(resultado.getString("cura"));
            lista.add(med);
        }
        return lista;
    }
    public ArrayList<Tratamiento> getOtros(String DNI, String NSS) throws SQLException{
        ResultSet resultado  = bd.consultar("select idmedico, to_char(fecha,'dd/mm/yyyy hh24:mi') fecha,to_char(inicio,'dd/mm/yyyy hh24:mi') inicio, to_char(fin,'dd/mm/yyyy hh24:mi') fin, frecuencia, cancelada, motivocancelacion, comentario"
                        + " from otros"
                        + " where to_char(fin,'yyyy/mm/dd') >= to_char(sysdate,'yyyy/mm/dd')"
                        + " and  to_char(inicio,'yyyy/mm/dd') <= to_char(sysdate,'yyyy/mm/dd')"
                        + " and (cancelada is null or cancelada = 0)"
                        + " and (dni = '"+DNI+"' and nss = '"+NSS+"')");
        
       ArrayList<Tratamiento> lista = new ArrayList<Tratamiento>();
        
        while(resultado.next()){
            Tratamiento med = new Tratamiento();
            med.setMedico(resultado.getString("idmedico"));
            med.setFecha(resultado.getString("fecha"));
            med.setInicio(resultado.getString("inicio"));
            med.setFin(resultado.getString("fin"));
            med.setFrecuencia(resultado.getInt("frecuencia"));
            med.setCancelada( resultado.getBoolean("cancelada"));
            med.setMotivoCancelacion(resultado.getString("motivocancelacion"));
            med.setNombre(resultado.getString("comentario"));
            lista.add(med);
        }
        return lista;
    }
    
     public ArrayList<String> getMedicamentos() throws SQLException{
       ResultSet resultado  = bd.consultar("select distinct nombre from medicamento");
       ArrayList<String> lista = new ArrayList<String>();
        while(resultado.next()){
            String str=(resultado.getString("nombre"));
            lista.add(str);
        }
        return lista;
    }
    public ArrayList<String> getAlergias() throws SQLException{
       ResultSet resultado  = bd.consultar("select nombre from alergias");
       ArrayList<String> lista = new ArrayList<String>();
        while(resultado.next()){
            String str=resultado.getString("nombre");
            lista.add(str);
        }
        return lista;
    }
    public ArrayList<String> getDiscapacidades() throws SQLException{
       ResultSet resultado  = bd.consultar("select nombre from discapacidades");
       ArrayList<String> lista = new ArrayList<String>();
        while(resultado.next()){
            String str=resultado.getString("nombre");
            lista.add(str);
        }
        return lista;
    }
    public ArrayList<String> getAlergias(String DNI, String NSS) throws SQLException{
       ResultSet resultado  = bd.consultar("select al.nombre from alergias al, pacientes_alergias pa where al.idalergia=pa.idalergia and pa.dni='"+DNI+"' and pa.nss='"+NSS+"'");
       ArrayList<String> lista = new ArrayList<String>();
        while(resultado.next()){
            String str=resultado.getString("nombre");
            lista.add(str);
        }
        return lista;
    }
    public ArrayList<String> getDiscapacidades(String DNI, String NSS) throws SQLException{
       ResultSet resultado  = bd.consultar("select dis.nombre from discapacidades dis, pacientes_discapacidades pa where dis.iddiscapacidad=pa.iddiscapacidad and pa.dni='"+DNI+"' and pa.nss='"+NSS+"'");
       ArrayList<String> lista = new ArrayList<String>();
        while(resultado.next()){
            String str=resultado.getString("nombre");
            lista.add(str);
        }
        return lista;
    }   
    private String getMedicamento(String nombre, String marca) throws SQLException {
        ResultSet resultado  = bd.consultar("select idmedicamento from medicamento where nombre='"+nombre+"' and marca='"+marca+"'");
        if(resultado.next())return resultado.getString("idmedicamento");
        else return "";
    }
    public ArrayList<String> getMarca(String nombre) throws SQLException{
       ResultSet resultado  = bd.consultar("select marca from medicamento where nombre='"+nombre+"'");
       ArrayList<String> lista = new ArrayList<String>();
        while(resultado.next()){
            String str=(resultado.getString("marca"));
            lista.add(str);
        }
        return lista;
    }
}
